Manager 提供了可以进行所有数据类型共享的机制,就是可以以 dict list …… 类型进行进程的通信
在 Manager 中数据是不安全的,因为 Manager 中没有锁的机制,多个进程修改同一块数据时,就会导致数据的混乱,处理方式上锁
from multiprocessing import Manager
from multiprocessing import Process
def fun(dic):
print(dic, '子进程') # {'count': 0} 子进程
if __name__ == '__main__':
m = Manager()
d = m.dict({}) # 创建一个共享的字典
print(d, '主进程') # {} 主进程
d['count'] = 0
print(d, '主进程') # {'count': 0} 主进程
p = Process(target=fun, args=(d,)) # 将共享字典传递给子进程,从而实现进程之间的通信,普通的字典是不行的一定要是 Manager 创建的
p.start()
p.join() # 注意,子进程必须执行 .join() 方法,这样在子进程里面才能获取到字典不然只能获取到一个对象
在 Manager 中如果一个进程修改了共享的数据,那么另一个进程是会感知到的
from multiprocessing import Manager
from multiprocessing import Process
from multiprocessing import Lock
def work(dic, lock):
lock.acquire() # 上锁
dic['count'] -= 1 # 当共享的数据被修改了,其他进程是可以感知到的
print(dic, '子进程')
lock.release() # 解锁
if __name__ == '__main__':
lock = Lock()
m = Manager()
dic = m.dict({'count': 100}) # 创建一个共享字典
l = []
for i in range(100):
p = Process(target=work, args=(dic, lock))
p.start()
l.append(p)
[i.join() for i in l] # 子进程必须执行 .join() 方法,这样在子进程里面才能获取到字典不然只能获取到一个对象
print(dic, '--------- 主进程 ---------')